/**
 * 字典常量模块，实现字典解析
 * create by @author lms 2016.08.19
 * last update by @author lms 2020.07.03(改成从缓存直接获取数据)
 */
package ms.core.gateway.utils;

import java.util.ArrayList;
import java.util.List;

import ms.core.gateway.dao.DicConstDao;
import ms.core.gateway.response.DicConstVO;
import ms.core.gateway.response.DicConstVO.ConstItem;
import ms.core.tool.StrTool;

public class DicConstUtils {
	private static List<DicConstVO> consts = new ArrayList<>();

	static {
		loadConsts();
	}
	
	private synchronized static void loadConsts() {
		DicConstDao dao = new DicConstDao();
		consts = dao.getConsts(null, null);
	}

	/**
	 * 根据业务表代码、常量名称以及常量Id值，获取常量值
	 * @param code 表代码
	 * @param name 字段名
	 * @param constId 常量Id
	 * @return
	 */
	public synchronized static String codeOfValue(String code, String name, String constId){
		for(DicConstVO item: consts) {
			if (item.getCode().equalsIgnoreCase(code) && item.getName().equalsIgnoreCase(name)) {
				List<ConstItem> list = item.getItems(true);
				for(ConstItem e: list) {
					if (e.getId() instanceof String) {
						String id = (String) e.getId();
						if (id.equalsIgnoreCase(constId)) {
							return e.getValue();
						}
					} else {
						int id = (int) e.getId();
						if (id==StrTool.strToInt(constId, 0)) {
							return e.getValue();
						}
					}
				}
			}
		}

		return null;
	}

	/**
	 * 根据业务表代码、常量名称以及常量Id值，获取常量值
	 * @param code 表代码
	 * @param name 字段名
	 * @param constId 常量Id
	 * @return
	 */
	public synchronized static String codeOfValue(String code, String name, int constId){
		String CONST = String.valueOf(constId);

		return codeOfValue(code, name, CONST);
	}

	/**
	 * 根据业务表代码、常量名称以及常量值，获取常量Id
	 * @param code 表代码
	 * @param name 字段名
	 * @param constId 常量Id
	 * @return
	 */
	public synchronized static Object valueOfCode(String code, String name, String value){
		for(DicConstVO item: consts) {
			if (item.getCode().equalsIgnoreCase(code) && item.getName().equalsIgnoreCase(name)) {
				List<ConstItem> list = item.getItems(true);
				for(ConstItem e: list) {
					if (e.getValue().equalsIgnoreCase(value)) {
						return e.getId();
					}
				}
			}
		}

		return null;
	}

	/**
	 * 根据业务表代码、常量名称以及常量Id值，验证常量有效性
	 * @param code 表代码
	 * @param name 字段名
	 * @param constId 常量Id
	 * @return
	 */
	public synchronized static boolean verify(String code, String name, String constId){
		for(DicConstVO item: consts) {
			if (item.getCode().equalsIgnoreCase(code) && item.getName().equalsIgnoreCase(name)) {
				List<ConstItem> list = item.getItems(true);
				for(ConstItem e: list) {
					// 常量编码为字符串
					if (e.getId() instanceof String) {
						String id = (String) e.getId();
						if (id.equalsIgnoreCase(constId)) {
							return true;
						}
					} else {
						int id = (int) e.getId();
						if (id==StrTool.strToInt(constId, 0))
							return true;
					}
				}
			}
		}

		return false;
	}
	
	/**
	 * 根据业务表代码、常量名称以及常量Id值，验证常量有效性
	 * @param code 表代码
	 * @param name 字段名
	 * @param constId 常量Id
	 * @return
	 */
	public synchronized static boolean verify(String code, String name, int constId){
		String CONST = String.valueOf(constId);
		
		return verify(code, name, CONST);
	}

	/**
	 * 获取系统常量列表
	 * 
	 * @param code 表代码
	 * @param name 常量名
	 * @return
	 */
	public synchronized static List<ConstItem> getConst(String code, String name, boolean loadHide) {
		for(DicConstVO item: consts) {
			if (item.getCode().equalsIgnoreCase(code) && item.getName().equalsIgnoreCase(name)) {
				return item.getItems(loadHide);
			}
		}

		return new ArrayList<>();
	}
}
